package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.event.ItemSelectEvent;
import org.primefaces.model.chart.BarChartSeries;
import org.primefaces.model.chart.CartesianChartModel;
import org.primefaces.model.chart.LineChartSeries;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.administracion.bean.ZonaBean;
import com.sisgesbyte.services.proyeccion.ProyeccionZonaPorPeriodoService;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyeccionZonaResponse;
import com.sisgesbyte.services.proyeccion.bean.ProyeccionZonaBean;
import com.sisgesbyte.services.ventas.MantenimientoPeriodo;
import com.sisgesbyte.services.ventas.MantenimientoZona;
import com.sisgesbyte.services.ventas.bean.PeriodoBean;
import com.sisgesbyte.services.ventas.bean.PeriodoListaBean;
import com.sisgesbyte.services.ventas.bean.ZonaListaResponse;

@ManagedBean
@ViewScoped
public class ProyeccionZonasMBean implements Serializable{

	private static final long serialVersionUID = 1L;
	@EJB
	private MantenimientoPeriodo mantenimientoPeriodo;
	@EJB
	private ProyeccionZonaPorPeriodoService proyeccionZonaPorPeriodoService;
	@EJB
	private MantenimientoZona mantenimientoZona;
	private List<ZonaBean> listaZonas;
	private int idZona;
	private List<ProyeccionZonaBean> listaAvanceProyeccionZona;
	private List<PeriodoBean> listaPeriodos;
	private Integer periodoDefault;
	private CartesianChartModel combinedModel;
	private CartesianChartModel combinedModelPeriodo;
	private Integer maxMontoGeneral = 0;
	private Integer maxMontoPeriodo = 0;
	private String colorGeneral;
	private String colorPeriodo;
	private ProyeccionZonaBean selectedZona;
	private Boolean mostrarGraficos;
	
	
	@PostConstruct
	public void init() {
		colorGeneral="";
		setIdZona(0);
		setMostrarGraficos(true);
    	cargarPeriodos();
    	mostrarPeriodoDefault();
		cargarZonas();
		inicializar();
	}
	
	public void inicializar(){
		try{
		selectedZona = new ProyeccionZonaBean();
		AvanceProyeccionZonaResponse response = proyeccionZonaPorPeriodoService.listaAvanceZonas(ObtenerIdTransaccion(), periodoDefault,idZona);
			if(response.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				setMostrarGraficos(true);
				this.listaAvanceProyeccionZona = response.getListaAvanceProyeccionZona();
				construirBarras();
			}else{
				FacesContext context = FacesContext.getCurrentInstance();
		        context.addMessage(null,  new FacesMessage(FacesMessage.SEVERITY_WARN,"Error Funcional",  "Mensaje " +response.getMensajeRespuesta()));
				setMostrarGraficos(false);
			}
		}catch(Exception e){
			FacesContext context = FacesContext.getCurrentInstance();
	        context.addMessage(null,  new FacesMessage(FacesMessage.SEVERITY_ERROR,"Error Tecnico",  "Mensaje " +e.getMessage()));
			setMostrarGraficos(false);
		}
			
	}
	public void construirBarras(){
		List<Integer> listaProyGeneral = new ArrayList<Integer>();
		List<Integer> listaProyPeriodo = new ArrayList<Integer>();
		combinedModel = new CartesianChartModel();
		combinedModelPeriodo = new CartesianChartModel();
		
		BarChartSeries zonas = new BarChartSeries();
		BarChartSeries zonasPeriodo = new BarChartSeries();
		zonas.setLabel("Zonas");
		zonasPeriodo.setLabel("Zonas");
		StringBuilder jpql = new StringBuilder();
		StringBuilder jpqlPeriodo = new StringBuilder();
		
		for(ProyeccionZonaBean ls : listaAvanceProyeccionZona){
			zonas.set(ls.getZona(), ls.getAvanceMontoGeneral());
			zonasPeriodo.set(ls.getZona(), ls.getAvanceMontoPeriodo());
			jpql.append(ls.getColorBandaGeneral());
			jpql.append(",");
			jpqlPeriodo.append(ls.getColorBandaPeriodo());
			jpqlPeriodo.append(",");
		}
		
		setColorGeneral(jpql.substring(0, jpql.length()-1));
		setColorPeriodo(jpqlPeriodo.substring(0, jpqlPeriodo.length()-1));
		
        LineChartSeries proyeccion = new LineChartSeries();
        LineChartSeries proyeccionPeriodo = new LineChartSeries();
        proyeccion.setLabel("Proyeccion");
        
        for(ProyeccionZonaBean ls : listaAvanceProyeccionZona){
        	listaProyGeneral.add(Integer.valueOf((ls.getProyeccionMontoGeneral().setScale(2, BigDecimal.ROUND_HALF_UP)).intValue()));
        	listaProyPeriodo.add(Integer.valueOf((ls.getProyeccionMontoPeriodo().setScale(2, BigDecimal.ROUND_HALF_UP)).intValue()));
        	proyeccion.set(ls.getZona(), ls.getProyeccionMontoGeneral());
        	proyeccionPeriodo.set(ls.getZona(), ls.getProyeccionMontoPeriodo());
		}
        //ordenamos la lista de menor a mayor
        Collections.sort(listaProyGeneral);
        Collections.sort(listaProyPeriodo);
        int porcentaje = Integer.valueOf(listaProyGeneral.get(listaProyGeneral.size()-1))*10/100;
        int porcentajePeriodo = Integer.valueOf(listaProyPeriodo.get(listaProyPeriodo.size()-1))*10/100;
        setMaxMontoGeneral(listaProyGeneral.get(listaProyGeneral.size()-1) + porcentaje);
        setMaxMontoPeriodo(listaProyPeriodo.get(listaProyPeriodo.size()-1) + porcentajePeriodo);
       
        combinedModel.addSeries(zonas);
		combinedModel.addSeries(proyeccion);
		
		combinedModelPeriodo.addSeries(zonasPeriodo);
		combinedModelPeriodo.addSeries(proyeccionPeriodo);
	}
	public void cargarPeriodos(){
		try{
			PeriodoListaBean periodos = mantenimientoPeriodo.listaPeriodos(ObtenerIdTransaccion());
			this.listaPeriodos =periodos.getListaPeriodos();
		}catch(Exception e){
			System.out.println("Error al cargar los periodos: " + e);
		}
	}
	public void itemSelect(ItemSelectEvent event) {
		setSelectedZona(listaAvanceProyeccionZona.get(event.getItemIndex()));
		
	}
	public void mostrarPeriodoDefault(){
		 for(PeriodoBean ls : getListaPeriodos()){
			 	if(ls.getDefecto() !=null && ls.getDefecto()==true){
			 		 setPeriodoDefault(ls.getId());
			 	}
		 }
	}
	public void cargarZonas(){
		try{
			FiltrosSQLBean filtro= new FiltrosSQLBean();
			 List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			 FiltrosBean filtroCampos = new FiltrosBean();
			 List<String> campos = new ArrayList<String>();
			 campos.add("active");
			 filtroCampos.setCampos(campos);
			 filtroCampos.setOperador("=");
			 listaFiltros.add(filtroCampos);
			 List<Object> valores = new ArrayList<Object>();
			 valores.add(true);
			 filtro.setListaFiltros(listaFiltros);
			 filtro.setListaValores(valores);
			ZonaListaResponse zonas = mantenimientoZona.listaZonas(ObtenerIdTransaccion(), filtro);
			if(zonas.getCodigoRespuesta().equalsIgnoreCase(ConstantesInternasSistema.CODIGO_EXITO)){
				this.listaZonas =zonas.getListaZonas();
			}
			
		}catch(Exception e){
			System.out.println("Error al obtener las zonas: " + e);
		}
	}
	public String ObtenerIdTransaccion() {
		String sessionId = "";
		try{
			FacesContext fCtx = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) fCtx.getExternalContext().getSession(false);
			sessionId = session.getId().replace(".undefined", "");
		}catch(Exception e){
			sessionId="Error";
			System.out.println("Error al obtener Session" + e);
		}
		return sessionId;
	}
	public List<PeriodoBean> getListaPeriodos() {
		return listaPeriodos;
	}

	public void setListaPeriodos(List<PeriodoBean> listaPeriodos) {
		this.listaPeriodos = listaPeriodos;
	}

	public Integer getPeriodoDefault() {
		return periodoDefault;
	}

	public void setPeriodoDefault(Integer periodoDefault) {
		this.periodoDefault = periodoDefault;
	}

	public List<ProyeccionZonaBean> getListaAvanceProyeccionZona() {
		return listaAvanceProyeccionZona;
	}

	public void setListaAvanceProyeccionZona(
			List<ProyeccionZonaBean> listaAvanceProyeccionZona) {
		this.listaAvanceProyeccionZona = listaAvanceProyeccionZona;
	}

	public CartesianChartModel getCombinedModel() {
		return combinedModel;
	}

	public void setCombinedModel(CartesianChartModel combinedModel) {
		this.combinedModel = combinedModel;
	}

	public Integer getMaxMontoGeneral() {
		return maxMontoGeneral;
	}

	public void setMaxMontoGeneral(Integer maxMontoGeneral) {
		this.maxMontoGeneral = maxMontoGeneral;
	}

	public Integer getMaxMontoPeriodo() {
		return maxMontoPeriodo;
	}

	public void setMaxMontoPeriodo(Integer maxMontoPeriodo) {
		this.maxMontoPeriodo = maxMontoPeriodo;
	}

	public String getColorGeneral() {
		return colorGeneral;
	}

	public void setColorGeneral(String colorGeneral) {
		this.colorGeneral = colorGeneral;
	}

	public CartesianChartModel getCombinedModelPeriodo() {
		return combinedModelPeriodo;
	}

	public void setCombinedModelPeriodo(CartesianChartModel combinedModelPeriodo) {
		this.combinedModelPeriodo = combinedModelPeriodo;
	}

	public String getColorPeriodo() {
		return colorPeriodo;
	}

	public void setColorPeriodo(String colorPeriodo) {
		this.colorPeriodo = colorPeriodo;
	}

	public ProyeccionZonaBean getSelectedZona() {
		return selectedZona;
	}

	public void setSelectedZona(ProyeccionZonaBean selectedZona) {
		this.selectedZona = selectedZona;
	}

	public List<ZonaBean> getListaZonas() {
		return listaZonas;
	}

	public void setListaZonas(List<ZonaBean> listaZonas) {
		this.listaZonas = listaZonas;
	}

	public int getIdZona() {
		return idZona;
	}

	public void setIdZona(int idZona) {
		this.idZona = idZona;
	}

	public Boolean getMostrarGraficos() {
		return mostrarGraficos;
	}

	public void setMostrarGraficos(Boolean mostrarGraficos) {
		this.mostrarGraficos = mostrarGraficos;
	}
}
